57 for (i = 0; i < (MAGBUFFSIZEX - 1); i++)
58 pthisMagBuffer->
tanarray[i] = (
int16) (100.0F * tanf(
PI * (-0.5F + (
float) (i + 1) / MAGBUFFSIZEX)));
62 pFlash = (
float *) (CALIBRATION_NVM_ADDR + MAG_NVM_OFFSET);
63 if (*((
uint32 *) pFlash++) == 0x12345678)
67 for (i =
CHX; i <=
CHZ; i++) pthisMagCal->
fV[i] = *(pFlash++);
68 for (i =
CHX; i <=
CHZ; i++)
69 for (j =
CHX; j <=
CHZ; j++)
70 pthisMagCal->
finvW[i][j] = *(pFlash++);
71 pthisMagCal->
fB = *(pFlash++);
72 pthisMagCal->
fBSq = *(pFlash++);
80 pthisMagCal->
fV[
CHX] = pthisMagCal->
fV[
CHY] = pthisMagCal->
fV[
CHZ] = 0.0F;
118 if (pthisMag->
iBc[
CHZ] == 0)
return;
135 (pthisMagBuffer->
index[j][k] != -1))
138 for (i =
CHX; i <=
CHZ; i++)
140 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
143 pthisMagBuffer->
index[j][k] = loopcounter;
150 (pthisMagBuffer->
index[j][k] == -1))
153 for (i =
CHX; i <=
CHZ; i++)
155 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
158 pthisMagBuffer->
index[j][k] = loopcounter;
168 if (pthisMagBuffer->
index[j][k] < i)
171 if (pthisMagBuffer->
index[j][k] != -1)
178 i = pthisMagBuffer->
index[l][m];
185 pthisMagBuffer->
index[l][m] = -1;
191 (pthisMagBuffer->
index[j][k] == -1))
194 for (i =
CHX; i <=
CHZ; i++)
196 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
199 pthisMagBuffer->
index[j][k] = loopcounter;
207 (pthisMagBuffer->
index[j][k] != -1))
211 for (i =
CHX; i <=
CHZ; i++)
213 idelta += abs((
int32) pthisMag->
iBs[i] -
214 (
int32) pthisMagBuffer->
iBs[i][j][k]);
221 for (i =
CHX; i <=
CHZ; i++)
223 pthisMagBuffer->
iBs[i][j][k] = pthisMag->
iBs[i];
226 pthisMagBuffer->
index[j][k] = loopcounter;
245 if (pthisMagBuffer->
index[j][k] != -1)
249 for (i =
CHX; i <=
CHZ; i++)
251 idelta += abs((
int32) pthisMag->
iBs[i] -
252 (
int32) pthisMagBuffer->
iBs[i][j][k]);
279 for (i =
CHX; i <=
CHZ; i++)
281 pthisMagBuffer->
iBs[i][l][m] = pthisMag->
iBs[i];
284 pthisMagBuffer->
index[l][m] = loopcounter;
304 for (i =
CHX; i <=
CHZ; i++)
306 ftmp[i] = pthisMag->
fBs[i] - pthisMagCal->
fV[i];
310 for (i =
CHX; i <=
CHZ; i++)
420 pthisMagCal->
fB = pthisMagCal->
ftrB;
421 pthisMagCal->
fBSq = pthisMagCal->
fB * pthisMagCal->
fB;
422 for (i =
CHX; i <=
CHZ; i++)
424 pthisMagCal->
fV[i] = pthisMagCal->
ftrV[i];
425 for (j =
CHX; j <=
CHZ; j++)
436 pthisMagBuffer->
index[i][j] = -1;
484 pthisMagCal->
fYTY = 0.0F;
485 for (i = 0; i < 4; i++)
487 pthisMagCal->
fvecA[i] = 0.0F;
488 for (j = i; j < 4; j++) pthisMagCal->
fmatA[i][j] = 0.0F;
493 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
500 if (pthisMagBuffer->
index[i][j] != -1)
503 for (k = 0; k < 3; k++)
510 for (i = 0; i < 3; i++)
512 if (pthisMagCal->
iSumBs[i] >= 0)
541 int32 iBsZeroMean[3];
547 if (pthisMagBuffer->
index[i][j] != -1)
550 for (k = 0; k < 3; k++)
554 pthisMagCal->
fmatA[0][0] += (
float) (iBsZeroMean[0] * iBsZeroMean[0]);
555 pthisMagCal->
fmatA[0][1] += (float) (iBsZeroMean[0] * iBsZeroMean[1]);
556 pthisMagCal->
fmatA[0][2] += (float) (iBsZeroMean[0] * iBsZeroMean[2]);
557 pthisMagCal->
fmatA[1][1] += (float) (iBsZeroMean[1] * iBsZeroMean[1]);
558 pthisMagCal->
fmatA[1][2] += (float) (iBsZeroMean[1] * iBsZeroMean[2]);
559 pthisMagCal->
fmatA[2][2] += (float) (iBsZeroMean[2] * iBsZeroMean[2]);
562 fBsZeroMeanSq = (float)
571 for (k = 0; k < 3; k++)
572 pthisMagCal->
fvecA[k] += (
float) iBsZeroMean[k] * fBsZeroMeanSq;
573 pthisMagCal->
fvecA[3] += fBsZeroMeanSq;
576 pthisMagCal->
fYTY += fBsZeroMeanSq * fBsZeroMeanSq;
597 for (i = 0; i < 4; i++)
599 for (j = 0; j <= i; j++)
600 pthisMagCal->
fmatB[i][j] = pthisMagCal->
fmatB[j][i] = pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
604 for (i = 0; i < 4; i++) pfRows[i] = pthisMagCal->
fmatB[i];
622 for (i = 0; i < 4; i++)
624 pthisMagCal->
fvecB[i] = pthisMagCal->
fmatB[i][0] * pthisMagCal->
fvecA[0];
625 for (j = 1; j < 4; j++)
626 pthisMagCal->
fvecB[i] += pthisMagCal->
fmatB[i][j] * pthisMagCal->
fvecA[j];
631 for (i =
CHX; i <=
CHZ; i++)
632 pthisMagCal->
ftrV[i] = ftmp * pthisMagCal->
fvecB[i];
635 pthisMagCal->
ftrB = pthisMagCal->
fvecB[3] *
638 for (i =
CHX; i <=
CHZ; i++)
639 pthisMagCal->
ftrB += pthisMagCal->
ftrV[i] * pthisMagCal->
ftrV[i];
640 pthisMagCal->
ftrB = sqrtf(fabs(pthisMagCal->
ftrB));
644 for (i =
CHX; i <=
CHZ; i++)
645 pthisMagCal->
ftrV[i] += (
float) pthisMagCal->
iSumBs[i] * ftmp;
649 fE = pthisMagCal->
fvecB[0] * pthisMagCal->
fvecA[0];
650 for (i = 1; i < 4; i++)
651 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
654 fE = pthisMagCal->
fYTY - 2.0F * fE;
657 for (i = 0; i < 4; i++)
659 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][0] * pthisMagCal->
fvecB[0];
660 for (j = 1; j < 4; j++)
661 pthisMagCal->
fvecA[i] += pthisMagCal->
fmatA[i][j] * pthisMagCal->
fvecB[j];
665 for (i = 0; i < 4; i++)
666 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
696 #define MATRIX_7_SIZE 7 714 pthisMagCal->
fmatA[i][j] = 0.0F;
718 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
723 if (pthisMagBuffer->
index[i][j] != -1)
726 for (k = 0; k < 3; k++)
733 for (i = 0; i < 3; i++)
735 if (pthisMagCal->
iSumBs[i] >= 0)
765 if (pthisMagBuffer->
index[i][j] != -1)
768 for (k = 0; k < 3; k++)
770 pthisMagCal->
fvecA[k + 3] = (float)
772 (
int32) pthisMagBuffer->
iBs[k][i][j] -
775 pthisMagCal->
fvecA[k] = pthisMagCal->
fvecA[k + 3] * pthisMagCal->
fvecA[k + 3];
780 for (k = 0; k < 3; k++)
781 pthisMagCal->
fmatA[k][6] += pthisMagCal->
fvecA[k];
787 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
807 for (j = 0; j < i; j++)
808 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
814 pthisMagCal->
fmatB[i][j] = 0.0F;
815 pthisMagCal->
fmatB[i][i] = 1.0F;
816 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
864 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
880 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
901 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
906 fdetA = pthisMagCal->
fmatB[
CHX][imin] *
913 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
919 for (i =
CHX; i <=
CHZ; i++)
920 pthisMagCal->
ftrV[i] = -0.5F *
921 pthisMagCal->
fmatB[i + 3][imin] /
922 pthisMagCal->
fmatB[i][imin];
925 ftmp = -pthisMagCal->
fmatB[6][imin];
926 for (i =
CHX; i <=
CHZ; i++)
927 ftmp += pthisMagCal->
fmatB[i][imin] *
928 pthisMagCal->
ftrV[i] *
929 pthisMagCal->
ftrV[i];
939 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
940 for (i =
CHX; i <=
CHZ; i++)
942 pthisMagCal->
fA[i][i] = pthisMagCal->
fmatB[i][imin] * ftmp;
943 pthisMagCal->
ftrinvW[i][i] = sqrtf(fabsf(pthisMagCal->
fA[i][i]));
952 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
955 for (i =
CHX; i <=
CHZ; i++)
956 pthisMagCal->
ftrV[i] =
958 pthisMagCal->
ftrV[i] +
959 (
float) pthisMagCal->
iMeanBs[i]
983 #define MATRIX_10_SIZE 10 1001 pthisMagCal->
fmatA[i][j] = 0.0F;
1005 for (i = 0; i < 3; i++) pthisMagCal->
iSumBs[i] = 0;
1010 if (pthisMagBuffer->
index[i][j] != -1)
1013 for (k = 0; k < 3; k++)
1020 for (i = 0; i < 3; i++)
1022 if (pthisMagCal->
iSumBs[i] >= 0)
1053 if (pthisMagBuffer->
index[i][j] != -1)
1056 for (k = 0; k < 3; k++)
1057 pthisMagCal->
fvecA[k + 6] = (
float)
1059 (
int32) pthisMagBuffer->
iBs[k][i][j] -
1064 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1065 pthisMagCal->
fvecA[1] = 2.0F *
1066 pthisMagCal->
fvecA[6] *
1067 pthisMagCal->
fvecA[7];
1068 pthisMagCal->
fvecA[2] = 2.0F *
1069 pthisMagCal->
fvecA[6] *
1070 pthisMagCal->
fvecA[8];
1071 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1072 pthisMagCal->
fvecA[4] = 2.0F *
1073 pthisMagCal->
fvecA[7] *
1074 pthisMagCal->
fvecA[8];
1075 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1079 for (k = 0; k < 6; k++)
1080 pthisMagCal->
fmatA[k][9] += pthisMagCal->
fvecA[k];
1086 pthisMagCal->
fmatA[k][l] += pthisMagCal->
fvecA[k] * pthisMagCal->
fvecA[l];
1106 for (j = 0; j < i; j++)
1107 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fmatA[j][i];
1113 pthisMagCal->
fmatB[i][j] = 0.0F;
1114 pthisMagCal->
fmatB[i][i] = 1.0F;
1115 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1178 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1194 fresidue += fabsf(pthisMagCal->
fmatA[i][j]);
1197 if (fresidue > 0.0F)
1215 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[imin]) imin = i;
1230 fdetA = fabs(fdetA);
1232 pthisMagCal->
fmatB[i][imin] = -pthisMagCal->
fmatB[i][imin];
1239 for (i =
CHX; i <=
CHZ; i++)
1241 pthisMagCal->
ftrV[i] = pthisMagCal->
finvA[i][0] *
1242 pthisMagCal->
fmatB[6][imin] +
1243 pthisMagCal->
finvA[i][1] *
1244 pthisMagCal->
fmatB[7][imin] +
1245 pthisMagCal->
finvA[i][2] *
1246 pthisMagCal->
fmatB[8][imin];
1247 pthisMagCal->
ftrV[i] *= -0.5F;
1261 ftmp -= pthisMagCal->
fmatB[9][imin];
1262 ftmp += pthisMagCal->
fA[
CHX][
CHX] *
1265 ftmp += pthisMagCal->
fA[
CHY][
CHY] *
1268 ftmp += pthisMagCal->
fA[
CHZ][
CHZ] *
1271 pthisMagCal->
ftrB = sqrtf(fabsf(ftmp));
1275 pthisMagCal->
fvecA[imin] /
1277 )) / (pthisMagCal->
ftrB * pthisMagCal->
ftrB);
1283 for (i =
CHX; i <=
CHZ; i++)
1284 pthisMagCal->
ftrV[i] =
1286 pthisMagCal->
ftrV[i] +
1287 (
float) pthisMagCal->
iMeanBs[i]
1292 ftmp = powf(fabs(fdetA), -(
ONETHIRD));
1298 pthisMagCal->
ftrB *= sqrt(fabs(ftmp));
1303 for (i = 0; i < 3; i++)
1305 for (j = 0; j < 3; j++)
1307 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1308 pthisMagCal->
fmatB[i][j] = 0.0F;
1311 pthisMagCal->
fmatB[i][i] = 1.0F;
1312 pthisMagCal->
fvecA[i] = pthisMagCal->
fmatA[i][i];
1344 if (fabsf(pthisMagCal->
fmatA[i][j]) > 0.0F)
1346 pthisMagCal->
fvecA, i, j, 3);
1358 fresidue = fabsf(pthisMagCal->
fmatA[0][1]) + fabsf(pthisMagCal->
fmatA[0][2]) + fabsf(pthisMagCal->
fmatA[1][2]);
1359 if (fresidue > 0.0F)
1372 for (j = 0; j < 3; j++)
1374 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1375 for (i = 0; i < 3; i++)
1376 pthisMagCal->
fmatB[i][j] *= ftmp;
1382 for (i = 0; i < 3; i++)
1384 for (j = i; j < 3; j++)
1387 pthisMagCal->
fmatB[i][0] *
1388 pthisMagCal->
fmatB[j][0] +
1389 pthisMagCal->
fmatB[i][1] *
1390 pthisMagCal->
fmatB[j][1] +
1391 pthisMagCal->
fmatB[i][2] *
1392 pthisMagCal->
fmatB[j][2];
1436 for (i = 0; i < 4; i++)
1438 pthisMagCal->
fvecB[i] = 0.0F;
1439 for (j = i; j < 4; j++)
1441 pthisMagCal->
fmatA[i][j] = 0.0F;
1446 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1454 if (pthisMagBuffer->
index[j][k] != -1)
1459 for (l =
CHX; l <=
CHZ; l++)
1461 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1466 for (l =
CHX; l <=
CHZ; l++)
1468 pthisMagCal->
fvecA[l] = (float)
1470 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1473 pthisMagCal->
fvecA[l + 3] = pthisMagCal->
fvecA[l] * pthisMagCal->
fvecA[l];
1477 fBs2 = pthisMagCal->
fvecA[3] +
1478 pthisMagCal->
fvecA[4] +
1479 pthisMagCal->
fvecA[5];
1482 fSumBs4 += fBs2 * fBs2;
1485 for (l =
CHX; l <=
CHZ; l++)
1487 pthisMagCal->
fvecB[l] += pthisMagCal->
fvecA[l] * fBs2;
1491 pthisMagCal->
fvecB[3] += fBs2;
1511 pthisMagCal->
fmatA[3][3] = (float) iCount;
1517 for (i = 0; i < 4; i++)
1519 for (j = i; j < 4; j++)
1521 pthisMagCal->
fmatB[i][j] = pthisMagCal->
fmatB[j][i] = pthisMagCal->
fmatA[j][i] = pthisMagCal->
fmatA[i][j];
1526 for (i = 0; i < 4; i++)
1528 pfRows[i] = pthisMagCal->
fmatB[i];
1534 for (i = 0; i < 4; i++)
1536 pthisMagCal->
fvecA[i] = 0.0F;
1537 for (k = 0; k < 4; k++)
1539 pthisMagCal->
fvecA[i] += pthisMagCal->
fmatB[i][k] * pthisMagCal->
fvecB[k];
1547 for (i = 0; i < 4; i++)
1549 fE += pthisMagCal->
fvecA[i] * pthisMagCal->
fvecB[i];
1552 fE = fSumBs4 - 2.0F * fE;
1555 for (i = 0; i < 4; i++)
1557 pthisMagCal->
fvecB[i] = 0.0F;
1558 for (k = 0; k < 4; k++)
1560 pthisMagCal->
fvecB[i] += pthisMagCal->
fmatA[i][k] * pthisMagCal->
fvecA[k];
1565 for (i = 0; i < 4; i++)
1567 fE += pthisMagCal->
fvecB[i] * pthisMagCal->
fvecA[i];
1571 for (l =
CHX; l <=
CHZ; l++)
1573 pthisMagCal->
ftrV[l] = 0.5F * pthisMagCal->
fvecA[l];
1586 for (l =
CHX; l <=
CHZ; l++)
1588 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1590 (float) iOffset[l] *
1621 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1624 for (m = 0; m < 7; m++)
1626 for (n = m; n < 7; n++)
1628 pthisMagCal->
fmatA[m][n] = 0.0F;
1638 if (pthisMagBuffer->
index[j][k] != -1)
1643 for (l =
CHX; l <=
CHZ; l++)
1645 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1650 for (l =
CHX; l <=
CHZ; l++)
1652 pthisMagCal->
fvecA[l + 3] = (float)
1654 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1657 pthisMagCal->
fvecA[l] = pthisMagCal->
fvecA[l + 3] * pthisMagCal->
fvecA[l + 3];
1664 for (m = 0; m < 6; m++)
1666 pthisMagCal->
fmatA[m][6] += pthisMagCal->
fvecA[m];
1670 for (m = 0; m < 6; m++)
1672 for (n = m; n < 6; n++)
1674 pthisMagCal->
fmatA[m][n] += pthisMagCal->
fvecA[m] * pthisMagCal->
fvecA[n];
1685 pthisMagCal->
fmatA[6][6] = (float) iCount;
1691 for (m = 1; m < 7; m++)
1693 for (n = 0; n < m; n++)
1695 pthisMagCal->
fmatA[m][n] = pthisMagCal->
fmatA[n][m];
1705 for (i = 1; i < 7; i++)
1707 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[j])
1717 for (l =
CHX; l <=
CHZ; l++)
1719 pthisMagCal->
fA[l][l] = pthisMagCal->
fmatB[l][j];
1720 det *= pthisMagCal->
fA[l][l];
1721 pthisMagCal->
ftrV[l] = -0.5F *
1722 pthisMagCal->
fmatB[l + 3][j] /
1723 pthisMagCal->
fA[l][l];
1730 pthisMagCal->
fmatB[6][j] = -pthisMagCal->
fmatB[6][j];
1735 ftmp = -pthisMagCal->
fmatB[6][j];
1736 for (l =
CHX; l <=
CHZ; l++)
1738 ftmp += pthisMagCal->
fA[l][l] *
1739 pthisMagCal->
ftrV[l] *
1740 pthisMagCal->
ftrV[l];
1751 for (l =
CHX; l <=
CHZ; l++)
1753 pthisMagCal->
ftrinvW[l][l] = sqrtf(fabsf(pthisMagCal->
fA[l][l]));
1754 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1756 (float) iOffset[l] *
1784 iOffset[
CHX] = iOffset[
CHY] = iOffset[
CHZ] = 0;
1787 for (m = 0; m < 10; m++)
1789 for (n = m; n < 10; n++)
1791 pthisMagCal->
fmatA[m][n] = 0.0F;
1801 if (pthisMagBuffer->
index[j][k] != -1)
1806 for (l =
CHX; l <=
CHZ; l++)
1808 iOffset[l] = pthisMagBuffer->
iBs[l][j][k];
1813 for (l =
CHX; l <=
CHZ; l++)
1815 pthisMagCal->
fvecA[l + 6] = (float)
1817 (
int32) pthisMagBuffer->
iBs[l][j][k] -
1823 pthisMagCal->
fvecA[0] = pthisMagCal->
fvecA[6] * pthisMagCal->
fvecA[6];
1824 pthisMagCal->
fvecA[1] = 2.0F *
1825 pthisMagCal->
fvecA[6] *
1826 pthisMagCal->
fvecA[7];
1827 pthisMagCal->
fvecA[2] = 2.0F *
1828 pthisMagCal->
fvecA[6] *
1829 pthisMagCal->
fvecA[8];
1830 pthisMagCal->
fvecA[3] = pthisMagCal->
fvecA[7] * pthisMagCal->
fvecA[7];
1831 pthisMagCal->
fvecA[4] = 2.0F *
1832 pthisMagCal->
fvecA[7] *
1833 pthisMagCal->
fvecA[8];
1834 pthisMagCal->
fvecA[5] = pthisMagCal->
fvecA[8] * pthisMagCal->
fvecA[8];
1839 for (m = 0; m < 9; m++)
1841 pthisMagCal->
fmatA[m][9] += pthisMagCal->
fvecA[m];
1845 for (m = 0; m < 9; m++)
1847 for (n = m; n < 9; n++)
1849 pthisMagCal->
fmatA[m][n] += pthisMagCal->
fvecA[m] * pthisMagCal->
fvecA[n];
1860 pthisMagCal->
fmatA[9][9] = (float) iCount;
1866 for (m = 1; m < 10; m++)
1868 for (n = 0; n < m; n++)
1870 pthisMagCal->
fmatA[m][n] = pthisMagCal->
fmatA[n][m];
1880 for (i = 1; i < 10; i++)
1882 if (pthisMagCal->
fvecA[i] < pthisMagCal->
fvecA[j])
1888 pthisMagCal->
fA[0][0] = pthisMagCal->
fmatB[0][j];
1889 pthisMagCal->
fA[0][1] = pthisMagCal->
fA[1][0] = pthisMagCal->
fmatB[1][j];
1890 pthisMagCal->
fA[0][2] = pthisMagCal->
fA[2][0] = pthisMagCal->
fmatB[2][j];
1891 pthisMagCal->
fA[1][1] = pthisMagCal->
fmatB[3][j];
1892 pthisMagCal->
fA[1][2] = pthisMagCal->
fA[2][1] = pthisMagCal->
fmatB[4][j];
1893 pthisMagCal->
fA[2][2] = pthisMagCal->
fmatB[5][j];
1900 pthisMagCal->
fmatB[6][j] = -pthisMagCal->
fmatB[6][j];
1901 pthisMagCal->
fmatB[7][j] = -pthisMagCal->
fmatB[7][j];
1902 pthisMagCal->
fmatB[8][j] = -pthisMagCal->
fmatB[8][j];
1903 pthisMagCal->
fmatB[9][j] = -pthisMagCal->
fmatB[9][j];
1911 for (l =
CHX; l <=
CHZ; l++)
1913 pthisMagCal->
ftrV[l] = 0.0F;
1914 for (m =
CHX; m <=
CHZ; m++)
1916 pthisMagCal->
ftrV[l] += pthisMagCal->
finvA[l][m] * pthisMagCal->
fmatB[m + 6][j];
1919 pthisMagCal->
ftrV[l] *= -0.5F;
1923 pthisMagCal->
ftrB = sqrtf(fabsf(pthisMagCal->
fA[0][0] *
1925 2.0F * pthisMagCal->
fA[0][1] *
1927 2.0F * pthisMagCal->
fA[0][2] *
1929 pthisMagCal->
fA[1][1] * pthisMagCal->
ftrV[
CHY] *
1930 pthisMagCal->
ftrV[
CHY] + 2.0F *
1931 pthisMagCal->
fA[1][2] * pthisMagCal->
ftrV[
CHY] *
1932 pthisMagCal->
ftrV[
CHZ] + pthisMagCal->
fA[2][2] *
1934 pthisMagCal->
fmatB[9][j]));
1941 for (l =
CHX; l <=
CHZ; l++)
1943 pthisMagCal->
ftrV[l] = pthisMagCal->
ftrV[l] *
1945 (float) iOffset[l] *
1959 for (i = 0; i < 3; i++)
1961 for (j = 0; j < 3; j++)
1963 pthisMagCal->
fmatA[i][j] = pthisMagCal->
fA[i][j];
1971 for (j = 0; j < 3; j++)
1973 ftmp = sqrtf(sqrtf(fabsf(pthisMagCal->
fvecA[j])));
1974 for (i = 0; i < 3; i++)
1976 pthisMagCal->
fmatB[i][j] *= ftmp;
1983 for (i = 0; i < 3; i++)
1986 for (j = i; j < 3; j++)
1988 pthisMagCal->
ftrinvW[i][j] = 0.0F;
1991 for (k = 0; k < 3; k++)
1993 pthisMagCal->
ftrinvW[i][j] += pthisMagCal->
fmatB[i][k] * pthisMagCal->
fmatB[j][k];
float ftrB
trial value of geomagnetic field magnitude in uT
void fmatrixAeqInvA(float *A[], int8 iColInd[], int8 iRowInd[], int8 iPivot[], int8 isize, int8 *pierror)
function uses Gauss-Jordan elimination to compute the inverse of matrix A in situ on exit...
int8_t i7ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
#define MAGBUFFSIZEX
x dimension in magnetometer buffer (12x24 equals 288 elements)
void fComputeMagCalibration4(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag)
#define CHY
Used to access Y-channel entries in various data data structures.
float fmatB[10][10]
scratch 10x10 float matrix used by calibration algorithms
int16_t iBs[3]
averaged uncalibrated measurement (counts)
#define MINMEASUREMENTS7CAL
minimum number of measurements for 7 element calibration
void fInitializeMagCalibration(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer)
int16_t tanarray[MAGBUFFSIZEX-1]
array of tangents of (100 * angle)
int32_t iMeanBs[3]
average magnetic measurement (counts)
#define FITERRORAGINGSECS
24 hours: time (s) for fit error to increase (age) by e=2.718
void f3x3matrixAeqMinusA(float A[][3])
function negates all elements of 3x3 matrix A
void f3x3matrixAeqAxScalar(float A[][3], float Scalar)
function multiplies all elements of 3x3 matrix A by the specified scalar
float fvecB[4]
scratch 4x1 vector used by calibration algorithms
void iUpdateMagBuffer(MagBuffer *pthisMagBuffer, MagSensor *pthisMag, int32 loopcounter)
int8_t iNewCalibrationAvailable
flag denoting that a new calibration has been computed
int8_t iInitiateMagCal
flag to start a new magnetic calibration
void fInvertMagCal(MagSensor *pthisMag, MagCalibration *pthisMagCal)
int16_t iMagBufferCount
number of magnetometer readings
float f3x3matrixDetA(float A[][3])
function calculates the determinant of a 3x3 matrix
float ftrV[3]
trial value of hard iron offset z, y, z (uT)
Magnetic Calibration Structure.
float ftrinvW[3][3]
trial inverse soft iron matrix size
float fBc[3]
averaged calibrated measurement (uT)
#define MAXMEASUREMENTS
maximum number of measurements used for calibration
void fComputeMagCalibration7(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag)
int32_t iSumBs[3]
sum of measurements in buffer (counts)
int8_t i4ElementSolverTried
flag to denote at least one attempt made with 4 element calibration
int32_t iValidMagCal
solver used: 0 (no calibration) or 4, 7, 10 element
float fmatA[10][10]
scratch 10x10 float matrix used by calibration algorithms
float fvecA[10]
scratch 10x1 vector used by calibration algorithms
float ftrFitErrorpc
trial value of fit error %
void fEigenCompute10(float A[][10], float eigval[], float eigvec[][10], int8 n)
function computes all eigenvalues and eigenvectors of a real symmetric matrix A[0..n-1][0..n-1] stored in the top left of a 10x10 array A[10][10]
void fUpdateMagCalibration7Slice(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag)
float finvW[3][3]
current inverse soft iron matrix
int8_t iMagBufferReadOnly
flag to denote that the magnetic measurement buffer is temporarily read only
void fComputeMagCalibration10(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag)
float fV[3]
current hard iron offset x, y, z, (uT)
float fuTPerCount
uT per count
#define ONESIXTH
one sixth
#define MINMEASUREMENTS10CAL
minimum number of measurements for 10 element calibration
The sensor_fusion.h file implements the top level programming interface.
#define CAL_INTERVAL_SECS
300s or 5min interval for regular calibration checks
#define ONETHIRD
one third
float fA[3][3]
ellipsoid matrix A
void fRunMagCalibration(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag, int32 loopcounter)
void f3x3matrixAeqInvSymB(float A[][3], float B[][3])
function directly calculates the symmetric inverse of a symmetric 3x3 matrix only the on and above di...
void fUpdateMagCalibration10Slice(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag)
void fComputeEigSlice(float fmatA[10][10], float fmatB[10][10], float fvecA[10], int8 i, int8 j, int8 iMatrixSize)
void fUpdateMagCalibration4Slice(MagCalibration *pthisMagCal, MagBuffer *pthisMagBuffer, MagSensor *pthisMag)
int16_t iBc[3]
averaged calibrated measurement (counts)
#define CHX
Used to access X-channel entries in various data data structures.
float fFitErrorpc
current fit error %
void f3x3matrixAeqI(float A[][3])
function sets the 3x3 matrix A to the identity matrix
float fCountsPeruT
counts per uT
#define MESHDELTACOUNTS
magnetic buffer mesh spacing in counts (here 5uT)
int8_t iCalInProgress
flag denoting that a calibration is in progress
float finvA[3][3]
inverse of ellipsoid matrix A
float fBs[3]
averaged un-calibrated measurement (uT)
float fYTY
Y^T.Y for 4 element calibration = (iB^2)^2.
#define FUSION_HZ
(int) actual rate of fusion algorithm execution and sensor FIFO reads
int32_t index[MAGBUFFSIZEX][MAGBUFFSIZEY]
array of time indices
The MagSensor structure stores raw and processed measurements for a 3-axis magnetic sensor...
#define MAXBFITUT
maximum acceptable geomagnetic field B (uT) for valid calibration
#define MINMEASUREMENTS4CAL
minimum number of measurements for 4 element calibration
void f3x3matrixAeqScalar(float A[][3], float Scalar)
function sets every entry in the 3x3 matrix A to a constant scalar
float fB
current geomagnetic field magnitude (uT)
The Magnetometer Measurement Buffer holds a 3-dimensional "constellation" of data points...
float fBSq
square of fB (uT^2)
#define MAGBUFFSIZEY
y dimension in magnetometer buffer (12x24 equals 288 elements)
#define MINBFITUT
minimum acceptable geomagnetic field B (uT) for valid calibration
int16_t iBs[3][MAGBUFFSIZEX][MAGBUFFSIZEY]
uncalibrated magnetometer readings
int32_t itimeslice
counter for tine slicing magnetic calibration calculations
int8_t i10ElementSolverTried
flag to denote at least one attempt made with 4 element calibration